package lambda_expression;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

/**
 * Stream中常见的Api操作
 */
public class App8 {

    public static void main(String[] args) {
        List<String> accountList = new ArrayList<String>(){
            {
                add("songjang");
                add("likui");
                add("wuyong");
                add("gongsunsheng");
                add("linchong");
                add("luzhishen");
                add("wusong");
            }
        };


        // map()
//        List<String> newList = accountList.stream().map(x -> "梁山好汉：" + x).collect(Collectors.toList());
//        newList.forEach(System.out::println);
        // filter()
//        List<String> newList = accountList.stream().filter(x -> x.length() > 5).collect(Collectors.toList());
//        newList.forEach(System.out::println);
        accountList.stream()
                .peek(x -> System.out.println("peek1" + x))
                .peek(x -> System.out.println("peek2:" + x))
                .forEach(System.out::println);

        System.out.println("===============================");

        // Stream对于数字运算的支持
        List<Integer> intList = new ArrayList<Integer>(){{
            add(20);
            add(12);
            add(25);
            add(25);
            add(8);
            add(52);
        }};
        // skip（） 中间操作，有状态，跳过部分数据
        intList.stream().skip(3).forEach(System.out::println);
        // limit() 中间操作 ，有状态， 限制输出数据量
        intList.stream().skip(2).limit(2).forEach(System.out::println);
        // distinct() 中间操作，有状态，去除重复数据
        intList.stream().distinct().forEach(System.out::println);
        // sorted() 排序
        intList.stream().sorted((x,y) -> y-x).forEach(System.out::println); // y-x倒序
        // max() 获取最大值
        Optional optionalMax =intList.stream().max((x, y) -> x-y);
        System.out.println("max="+ optionalMax.get());
        // min() 获取最小值
        Optional optionalMin =intList.stream().min((x,y) -> x-y);
        System.out.println("min="+ optionalMin.get());
        // reduce() 合并处理数据
        Optional optionalReduce =intList.stream().reduce((sum,x) -> sum + x);
        System.out.println("reduce合并1="+ intList.stream().reduce(10,(sum,x) -> sum + x));
        System.out.println("reduce合并2="+ optionalReduce.get());

        List<Integer> numList = Arrays.asList(Integer.MAX_VALUE, Integer.MAX_VALUE);
        long result = numList.stream().reduce(0L,(sum,x) -> sum + x, (x,y) -> 0L);
        System.out.println("result="+result);

        List<Integer> strList = Arrays.asList(1, 2, 3, 4, 5, 6);
        List<String> newStringList = strList.stream().reduce(new ArrayList<String>(), (x, y) -> {
            x.add("element:"+y);
            return x;
        }, (x,y) -> null);
        System.out.println(newStringList);


    }

}
